4 REM   ******************************************

6 REM   ** (DFT6.01A) GENERATE/ANALYZE WAVEFORM **

8 REM   ******************************************

10 Q = 4096: GOSUB 900

12 PI = 3.141592653589793#: P2 = 2 * PI: K1 = P2 / Q: K2 = 1 / PI

14 DIM C(2, Q), S(2, Q), KC(2, Q), KS(2, Q)

16 CLS : FOR J = 0 TO Q: FOR I = 1 TO 2: C(I, J) = 0: S(I, J) = 0: NEXT: NEXT

20 CLS : REM *    MAIN MENU    *

22 PRINT : PRINT : PRINT "         MAIN MENU": PRINT

24 PRINT " 1 = TIME TRIALS": PRINT

31 PRINT " 2 = EXIT": PRINT : PRINT

32 PRINT SPC(10); "MAKE SELECTION";

34 A$ = INKEY$: IF A$ = "" THEN 34

36 A = VAL(A$): ON A GOSUB 300, 1000

38 GOTO 20

40 CLS : N = 1: M = 2: K5 = Q: K6 = -1: GOSUB 108

42 FOR J = 0 TO Q: C(2, J) = 0: S(2, J) = 0: NEXT

43 TIM9 = TIMER

44 GOSUB 200: REM - PERFORM DFT

45 TIM9 = TIMER - TIM9

46 GOSUB 140: REM - PRINT OUT FINAL VALUES

47 PRINT "TIME WAS "; TIM9; " SECONDS"

48 PRINT : INPUT "C/R TO CONTINUE"; A$

50 RETURN

80 CLS : GOSUB 150: REM PRINT HEADING

81 FOR I = 0 TO Q - 1: C(1, I) = 0: S(1, I) = 0: NEXT

82 N = 2: M = 1: K5 = 1: K6 = 1

84 GOSUB 200: REM INVERSE TRANSFORM

86 GOSUB 140: REM PRINT OUTPUT

88 PRINT : INPUT "C/R TO CONTINUE"; A$

90 RETURN

100 REM  ******************************************

102 REM  *         PROGRAM SUBROUTINES            *

104 REM  ******************************************

106 REM  *       PRINT COLUMN HEADINGS            *

108 PRINT : PRINT : IF COR$ = "P" THEN 116

110 PRINT "FREQ    F(COS)      F(SIN)      FREQ     F(COS)    F(SIN)"

112 PRINT

114 RETURN

116 PRINT "FREQ      F(MAG)       F(THETA)    FREQ       F(MAG)     F(THETA)"

118 GOTO 112

137 REM ******************************

138 REM *       PRINT OUTPUT         *

139 REM ******************************

140 IF COR$ = "P" THEN GOSUB 170

141 FOR Z = 0 TO Q / 2 - 1

142 PRINT USING "##_     "; Z;

144 PRINT USING "+###.#####_    "; C(M, Z); S(M, Z);

145 PRINT USING "##_    "; (Z + Q / 2);

146 PRINT USING "+###.#####_    "; C(M, Z + Q / 2); S(M, Z + Q / 2)

147 NEXT Z

148 RETURN

150 REM ******************************

152 REM *    PRINT COLUMN HEADINGS   *

154 PRINT

156 PRINT "                       RECONSTRUCTION": PRINT

158 PRINT " T                              T": PRINT

160 RETURN

170 REM CONVERT FROM RECTANGULAR TO POLAR COORDINATES

172 FOR I = 0 TO Q - 1

174 MAG = SQR(C(M, I) ^ 2 + S(M, I) ^ 2)

175 IF C(M, I) = 0 THEN 190

176 ANGLE = 180 / PI * ATN(S(M, I) / C(M, I))

177 IF C(M, I) > 0 THEN S(M, I) = ANGLE: GOTO 180

178 IF ANGLE > 0 THEN S(M, I) = ANGLE - 180

179 IF ANGLE < 0 THEN S(M, I) = ANGLE + 180

180 C(M, I) = MAG: NEXT

182 RETURN

190 IF S(M, I) = 0 THEN S(M, I) = 0: GOTO 180

192 S(M, I) = 90: GOTO 180

200 REM *******************************

202 REM *     TRANSFORM/RECONSTRUCT   *

204 REM *******************************

206 FOR J = 0 TO Q - 1: REM SOLVE EQNS FOR EACH FREQUENCY

208 FOR I = 0 TO Q - 1: REM MULTIPLY AND SUM EACH POINT

210 C(M, J) = C(M, J) + C(N, I) * COS(J * I * K1) + K6 * S(N, I) * SIN(J * I * K1)

211 S(M, J) = S(M, J) - K6 * C(N, I) * SIN(J * I * K1) + S(N, I) * COS(J * I * K1)

212 NEXT I

214 C(M, J) = C(M, J) / K5: S(M, J) = S(M, J) / K5: REM SCALE RESULTS

216 NEXT J

218 RETURN

299 REM          **************************

300 CLS : REM    *       TIME  TRIALS     *

301 Q = 256: REM **************************

302 FOR I = 0 TO Q - 1: C(1, I) = 0: S(1, I) = 0

304 FOR J = 1 TO 2: KC(J, I) = 0: KS(J, I) = 0: NEXT: NEXT

306 COR$ = "P"

310 INPUT "ARRAY SIZE AS POWER OF 2"; Q1

312 Q = 2 ^ Q1

324 FOR I = 0 TO Q - 1: C(1, I) = 0: S(1, I) = 0: NEXT

328 C(1, 0) = Q

332 M = 1

336 GOSUB 40: REM TAKE XFORM

340 PRINT "CONTINUE ILLUSTRATION ? (Y/N)"

342 A$ = INKEY$: IF A$ = "" THEN 342

344 IF A$ <> "N" AND A$ <> "n" THEN 310

346 RETURN

900 CLS : SCREEN 9, 1, 1: COLOR 15, 1: REM TEST DESCRIPTION

902 FOR DACNT = 1 TO 8

904 READ A$: PRINT A$

906 NEXT

908 INPUT "C/R TO CONTINUE"; A$

910 SCREEN 0, 0, 0: RETURN

920 DATA "                TEST 1"

922 DATA " "

930 DATA "This routine illustrates the time required to perform"

932 DATA "a DFT for various lengths of input data arrays."

934 DATA "[NOTE:  Modern computers have left the limitations of this"

936 DATA "software far behind (it was originally written on an 80286)."

937 DATA "We have had to open up the maximum array size to get"

938 DATA "significant execution times.]"

1000 STOP



